package org.mymybatis.core;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @program: mySSM
 * @description: JDBC事务管理器
 * @author:wjp
 * @create: 2025-02-16 20:38
 **/
public class JDBCTransaction implements Transaction{

    /**
     * 获取连接需要数据源对象来获取
     * 构建JDBCTransaction时初始化数据源对象
     */
    private DataSource dataSource;


    /**
     * 是否自动提交
     */
    private boolean autoCommit;

    /**
     * 由于事务操作是基于连接对象的，因此定义一个连接对象
     */
    private Connection connection;


    public JDBCTransaction(DataSource dataSource, boolean autoCommit) {
        this.dataSource = dataSource;
        this.autoCommit = autoCommit;
    }

    /**
     * 使用数据源对象获取连接
     * 由于事务是基于连接对象的
     * 为了确保事务正常，因此调用openSession方法时给内部的connection赋值
     * 保证一个事务管理器使用同一个connection
     */
    @Override
    public void openSession(){
        try {
            if (this.connection == null) {
                this.connection = dataSource.getConnection();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 提供get方法供其他对象使用
     * @return 连接对象
     */
    @Override
    public Connection getConnection(){
        return this.connection;
    }


    @Override
    public void commit() {
        try {
            connection.commit();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void rollback() {
        try {
            connection.rollback();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void close() {
        try {
            connection.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
